package com.chenfan.mcn.model.dto;

import cn.hutool.core.util.ArrayUtil;
import com.chenfan.mcn.config.UserVoContextHolder;
import com.chenfan.mcn.enums.ExcutionExportTypeEnum;
import com.chenfan.mcn.model.ContractExcutionOrder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author tangwei
 * Date:     2021/1/29 13:40
 * Description: 执行单列表搜索条件
 */
@EqualsAndHashCode(callSuper = true)
@Data
@SuppressWarnings("AlibabaPojoNoDefaultValue")
public class ExcutionOrderSearchDTO extends AbstractMcnPrivilegeDTO<ContractExcutionOrder> {

    private static final long serialVersionUID = -6246497823787094582L;
    private Long businessId;

    private String temporaryCode;

    /**
     * 执行单号
     */
    private String excuteCode;
    /**
     * 红人平台昵称
     */
    private String starNickName;

    /**
     * 红人昵称
     */
    private String starPetName;

    /**
     * 客户id
     */
    private Long customerId;

    /**
     * 红人类型(1-内部红人，2-外部红人，3-KOC红人执行单)
     */
    private Integer starType;

    /**
     * 单据状态：-2_待执行, -1_执行中, 0_待提交, 1_审批中, 2_审批通过, 3_审批拒绝, 4_已撤回, 9_作废
     */
    private List<Integer> approvalStatus;

    /**
     * 审批状态
     */
    private List<Long> flowStatus;

    /**
     * 通过审批流 待审批 获取的id集合
     */
    private List<Long> srcIds;

    /**
     * 执行人id
     */
    private Long excutorId;

    /**
     * 执行人名称
     */
    private String excutorName;

    /**
     * 收入合同编号
     */
    private String incomeContractCode;

    /**
     * 收入合同编号-数组
     */
    private List<String> incomeContractCodeList;

    /**
     * 收入合同类型
     */
    private Integer incomeContractType;

    /**
     * 红人id集合
     */
    private List<Long> starIds;

    /**
     * 红人平台ID集合
     */
    private List<Long> starPlatformIds;

    /**
     * 自定义导出类型集合:0,执行单基本信息;1,执行反馈;2,打款账户;3,计算分成;4,打款信息;5,KOC执行单导出
     */
    private String exportTypes;

    /**
     * 开始打款日期
     */
    private String startPaymentDate;

    /**
     * 结束打款日期
     */
    private String endPaymentDate;

    /**
     * 执行单回款状态
     */
    private List<Integer> paybackStatus;

    /**
     * 品牌
     */
    private String brandName;

    /**
     * 产品名称
     */
    private String productName;

    /**
     * 当前页
     */
    private Long pageNum = 1L;

    /**
     * 每页大小
     */
    private Long pageSize = 10L;
    /**
     * processId集合
     */
    private List<Long> processIds;

    /**
     * 创建开始时间
     */
    private Date beginDate;

    /**
     * 创建结束时间
     */
    private Date endDate;

    /**
     * AE提成结算状态：0:未结算；1:结算中；2:已结算
     */
    private Integer commissionSettleStatus;

    /**
     * 平台订单号
     */
    private String platformOrderCode;

    /**
     * AE提成结算状态：0:未结算；1:结算中；2:已结算
     */
    private List<Integer> commissionSettleStatusList;

    /**
     * 商务提成结算状态：0:未结算；1:结算中；2:已结算
     */
    private List<Integer> businessCommissionSettleStatusList;

    /**
     * 过滤调的执行单ID集合
     */
    private List<Long> excludeIds;

    /**
     * 红人ID
     */
    private Long starId;

    /**
     * 执行单号-数组
     */
    private List<String> excuteCodeList;

    /**
     * 实际发布日期-开始
     */
    private Date realPublishDateBegin;

    /**
     * 实际发布日期-结束
     */
    private Date realPublishDateEnd;

    /**
     * 发布日期-开始时间
     */
    private Date promisePublishDateBegin;

    /**
     * 发布日期-结束
     */
    private Date promisePublishDateEnd;

    /**
     * 平台id
     */
    private String platformId;


    /**
     * 执行单创建人
     */
    private String createName;

    /**
     * 业绩共享人
     */
    private String performanceSharerName;


    /**
     * 合同回款状态
     */
    private List<Integer> contractPaybackStatusList;

    /**
     * 提成人
     */
    private String commissionName;

    /**
     * 客户返点结算状态：0:未结算；1:结算中；2:已结算
     */
    private List<Integer> rebateSettleStatusList;

    /**
     * 结算方式（多选）
     */
    private List<String> settlementMethodList;

    /**
     * 内容部下小组-部门ID（多选）
     */
    private List<Long> subDepartmentIdList;

    /**
     * 我司合同主体id
     */
    private Long contractingId;

    /**
     * 合同签订日期-开始
     */
    private Date signDateStart;

    /**
     * 合同签订日期-结束
     */
    private Date signDateEnd;

    /**
     * 发布平台
     */
    private List<String> platformIdList;

    @Override
    public String getFieldName() {
        String fieldName = super.getFieldName();
        if(StringUtils.contains(fieldName, "ceo.real_publish_date")) {
            return fieldName.replace("ceo.real_publish_date", "ef.real_publish_date");
        }
        return fieldName;
    }


    @Override
    protected void extendUserPrivilege(StringBuilder sb) {
        sb.append(" AND (");
        if (CollectionUtils.isNotEmpty(this.getUserIds())) {
            sb.append(this.getAlias()).append("coordinator_id IN (").append(ArrayUtil.join(this.getUserIds().toArray(), ",")).append(")");
            sb.append(" OR " + this.getAlias()).append("excutor_id IN (").append(ArrayUtil.join(this.getUserIds().toArray(), ",")).append(")");
            sb.append(" OR " + this.getAlias()).append("create_by IN (").append(ArrayUtil.join(this.getUserIds().toArray(), ",")).append(")");
            sb.append(" OR ic.performance_sharer_id IN (").append(ArrayUtil.join(this.getUserIds().toArray(), ",")).append(")");
        } else {
            sb.append(this.getAlias()).append("coordinator_id = ").append(ObjectUtils.defaultIfNull(UserVoContextHolder.getUserId(), -1L));
            sb.append(" OR " + this.getAlias()).append("excutor_id = ").append(ObjectUtils.defaultIfNull(UserVoContextHolder.getUserId(), -1L));
            sb.append(" OR " + this.getAlias()).append("create_by = ").append(ObjectUtils.defaultIfNull(UserVoContextHolder.getUserId(), -1L));
            sb.append(" OR ic.performance_sharer_id = ").append(ObjectUtils.defaultIfNull(UserVoContextHolder.getUserId(), -1L));
        }
        sb.append(")");
    }

    @Override
    protected void extendCustomerPrivilege(StringBuilder sb) {
        return;
    }
}
